/**
 * 管理页面公共工具函数
 */

import { ElMessage } from 'element-plus'

/**
 * 格式化时间
 * @param {string|number} timestamp - 时间戳
 * @returns {string} 格式化后的时间字符串
 */
export const formatTime = (timestamp) => {
  if (!timestamp) return ''
  const date = new Date(timestamp)
  return date.toLocaleString('zh-CN')
}

/**
 * 处理图片加载错误
 * @param {Event} event - 图片加载错误事件
 * @param {string} fallbackSrc - 备用图片路径
 */
export const handleImageError = (event, fallbackSrc = '/images/avatar.ico') => {
  event.target.src = fallbackSrc
}

/**
 * 格式化文件大小
 * @param {number} bytes - 字节数
 * @returns {string} 格式化后的文件大小
 */
export const formatFileSize = (bytes) => {
  if (!bytes) return '0 B'
  const k = 1024
  const sizes = ['B', 'KB', 'MB', 'GB']
  const i = Math.floor(Math.log(bytes) / Math.log(k))
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
}

/**
 * 通用错误处理函数
 * @param {Error} error - 错误对象
 * @param {string} defaultMessage - 默认错误消息
 * @param {Object} errorMap - 错误码映射
 */
export const handleApiError = (error, defaultMessage = '操作失败', errorMap = {}) => {
  console.error('API错误:', error)
  
  let errorMessage = defaultMessage
  
  if (error.message) {
    // 根据HTTP状态码或错误消息确定具体错误
    if (error.message.includes('400')) {
      errorMessage = errorMap['400'] || '请求参数错误'
    } else if (error.message.includes('401')) {
      errorMessage = errorMap['401'] || '请先登录'
    } else if (error.message.includes('403')) {
      errorMessage = errorMap['403'] || '无权限执行此操作'
    } else if (error.message.includes('404')) {
      errorMessage = errorMap['404'] || '资源不存在'
    } else if (error.message.includes('413')) {
      errorMessage = errorMap['413'] || '文件过大'
    } else if (error.message.includes('network')) {
      errorMessage = errorMap['network'] || '网络连接失败，请检查网络后重试'
    }
  }
  
  ElMessage.error(errorMessage)
}

/**
 * 确认删除对话框
 * @param {string} itemName - 要删除的项目名称
 * @param {string} itemType - 项目类型（如"角色"、"文档"等）
 * @returns {Promise} 确认对话框的Promise
 */
export const confirmDelete = async (itemName, itemType = '项目') => {
  const { ElMessageBox } = await import('element-plus')
  return ElMessageBox.confirm(
    `确定要删除${itemType}"${itemName}"吗？删除后无法恢复。`,
    `确认删除${itemType}`,
    {
      confirmButtonText: '删除',
      cancelButtonText: '取消',
      type: 'warning',
      confirmButtonClass: 'el-button--danger'
    }
  )
}

/**
 * 确认操作对话框
 * @param {string} message - 确认消息
 * @param {string} title - 对话框标题
 * @param {string} confirmText - 确认按钮文本
 * @param {string} type - 对话框类型
 * @returns {Promise} 确认对话框的Promise
 */
export const confirmAction = async (message, title = '确认操作', confirmText = '确认', type = 'warning') => {
  const { ElMessageBox } = await import('element-plus')
  return ElMessageBox.confirm(message, title, {
    confirmButtonText: confirmText,
    cancelButtonText: '取消',
    type
  })
}

/**
 * 输入对话框
 * @param {string} message - 提示消息
 * @param {string} title - 对话框标题
 * @param {string} defaultValue - 默认值
 * @param {Function} validator - 验证函数
 * @returns {Promise} 输入对话框的Promise
 */
export const promptInput = async (message, title = '请输入', defaultValue = '', validator = null) => {
  const { ElMessageBox } = await import('element-plus')
  return ElMessageBox.prompt(message, title, {
    confirmButtonText: '确认',
    cancelButtonText: '取消',
    inputValue: defaultValue,
    inputValidator: validator || ((value) => {
      if (!value || value.trim() === '') {
        return '请输入内容'
      }
      return true
    })
  })
}

/**
 * 检查文件类型
 * @param {File} file - 文件对象
 * @param {Array} allowedTypes - 允许的文件类型
 * @param {Array} allowedExtensions - 允许的文件扩展名
 * @returns {boolean} 是否为允许的文件类型
 */
export const checkFileType = (file, allowedTypes = [], allowedExtensions = []) => {
  const isTypeValid = allowedTypes.length === 0 || allowedTypes.includes(file.type)
  const isExtensionValid = allowedExtensions.length === 0 || 
    allowedExtensions.some(ext => file.name.toLowerCase().endsWith(ext.toLowerCase()))
  
  return isTypeValid || isExtensionValid
}

/**
 * 检查文件大小
 * @param {File} file - 文件对象
 * @param {number} maxSizeMB - 最大文件大小（MB）
 * @returns {boolean} 文件大小是否符合要求
 */
export const checkFileSize = (file, maxSizeMB) => {
  return file.size / 1024 / 1024 < maxSizeMB
}

/**
 * 防抖函数
 * @param {Function} func - 要防抖的函数
 * @param {number} delay - 延迟时间（毫秒）
 * @returns {Function} 防抖后的函数
 */
export const debounce = (func, delay) => {
  let timeoutId
  return function (...args) {
    clearTimeout(timeoutId)
    timeoutId = setTimeout(() => func.apply(this, args), delay)
  }
}

/**
 * 学院选项
 */
export const HOUSE_OPTIONS = [
  { label: '格兰芬多', value: '格兰芬多' },
  { label: '斯莱特林', value: '斯莱特林' },
  { label: '拉文克劳', value: '拉文克劳' },
  { label: '赫奇帕奇', value: '赫奇帕奇' }
]
